package cl.tinet.trainee.proyecto.ejb;

import java.util.ArrayList;

import javax.annotation.PostConstruct;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.apache.log4j.Logger;

import cl.tinet.trainee.proyecto.dao.InterfazGenericaDAO;
import cl.tinet.trainee.proyecto.dao.SalaDAO;
import cl.tinet.trainee.proyecto.excepciones.DatosNulosException;
import cl.tinet.trainee.proyecto.excepciones.ObjetoDuplicadoException;
import cl.tinet.trainee.proyecto.excepciones.ObjetoNoEncontradoException;
import cl.tinet.trainee.proyecto.modelo.Sala;

/**
 * Clase que implementa los metodos de la interfaz InterfazUsuarioBean.
 * 
 * @author Jose Palma.
 * 
 */
@Stateless(mappedName = "salaBean", name = "salaBean")
public class SalaBeanImpl implements InterfazBeanGenerico<Sala> {
    /**
      * 
      */
    private static final Logger LOG = Logger.getLogger(SalaBeanImpl.class);
    /**
     * Manejador de entidad y contexto de persistencia de los datos.
     */
    @PersistenceContext(unitName = "dsPalma")
    private EntityManager em;
    /**
     * Capa dao.
     */
    private InterfazGenericaDAO<Sala> dao;

    /**
     * Instanciador de nuevo Entity Manager para cada acceso a la clase.
     */
    @PostConstruct
    public void init() {
        dao = new SalaDAO(em);
    }

    /**
     * {@inheritDoc}
     */
    public void agregar(Sala nuevaSala) throws ObjetoDuplicadoException {
        Sala sala = null;
        try {
            sala = buscar(nuevaSala);
        } catch (ObjetoNoEncontradoException e) {
            LOG.debug("SALA NO EXISTE" + nuevaSala.getIdSala());
        }
        if (sala != null) {
            throw new ObjetoDuplicadoException(
                    ObjetoDuplicadoException.OBJETO_DUPLICADO);
        } else {
            LOG.debug("Agregar sala: " + nuevaSala);
            dao.agregar(nuevaSala);
            LOG.debug("Agregar sala - Agregado");
        }
    }

    /**
     * {@inheritDoc}
     */
    public void borrar(Sala salaAEliminar) throws ObjetoNoEncontradoException {
        Sala salaEncontrada = buscar(salaAEliminar);
        if (salaEncontrada != null) {
            dao.borrar(salaEncontrada);
        }
    }

    /**
     * {@inheritDoc}
     */
    public void actualizar(Sala salaAActualizar)
            throws ObjetoNoEncontradoException {
        Sala salaEncontrada = buscar(salaAActualizar);
        if (salaEncontrada != null) {
            salaEncontrada.copiar(salaAActualizar);
            dao.actualizar(salaEncontrada);
        }
    }

    /**
     * {@inheritDoc}
     */
    public Sala buscar(Sala salaABuscar) throws ObjetoNoEncontradoException {
        Sala salaEncontrada = null;
        try {
            salaEncontrada = dao.buscar(salaABuscar);
        } catch (DatosNulosException e) {
            LOG.debug("LA CONSULTA NO OBTUVO DATOS: "
        + salaABuscar.getIdSala());
            throw new ObjetoNoEncontradoException(
                    ObjetoNoEncontradoException.OBJETO_NO_ENCONTRADO);

        }
        return (salaEncontrada);
    }

    /**
     * {@inheritDoc}
     */
    public ArrayList<Sala> listar() {
        return dao.listar();
    }

}
